home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 2003 May (DVD) / Macworld Resource DVD May 2003.toast / Data / Software / Bonus / Database / mysql-max-3.23.55.sit / mysql-max-3.23.55-apple-darwi.1 / mysql-test / mysql-test-run < prev    next >
Encoding:
Text File  |  2003-01-22  |  23.8 KB  |  954 lines  |  [TEXT/ttxt]

  1. #! /bin/sh
  2. # mysql-test-run - originally written by Matt Wagner <matt@mysql.com>
  3. # modified by Sasha Pachev <sasha@mysql.com>
  4. # Sligtly updated by Monty
  5. # Cleaned up again by Matt
  6. # Fixed by Sergei
  7. # :-)
  8.  
  9. #++
  10. # Access Definitions
  11. #--
  12. DB=test
  13. DBPASSWD=
  14. VERBOSE=""
  15. TZ=GMT-3; export TZ # for UNIX_TIMESTAMP tests to work
  16.  
  17. #++
  18. # Program Definitions
  19. #--
  20.  
  21. PATH=/bin:/usr/bin:/usr/local/bin:/usr/bsd:/usr/X11R6/bin:/usr/bin/X11
  22.  
  23. # Standard functions
  24.  
  25. which ()
  26. {
  27.   IFS="${IFS=   }"; save_ifs="$IFS"; IFS=':'
  28.   for file
  29.   do
  30.     for dir in $PATH
  31.     do
  32.       if test -f $dir/$file
  33.       then
  34.         echo "$dir/$file"
  35.         continue 2
  36.       fi
  37.     done
  38.     echo "which: no $file in ($PATH)"
  39.     exit 1
  40.   done
  41.   IFS="$save_ifs"
  42. }
  43.  
  44.  
  45. # No paths below as we can't be sure where the program is!
  46.  
  47. SED=sed
  48.  
  49. BASENAME=`which basename | $SED q`
  50. DIFF=`which diff | $SED q`
  51. CAT=cat
  52. CUT=cut
  53. TAIL=tail
  54. ECHO=echo # use internal echo if possible
  55. EXPR=expr # use internal if possible
  56. FIND=find
  57. GCOV=`which gcov | $SED q`
  58. PRINTF=printf
  59. RM=rm
  60. TIME=time
  61. TR=tr
  62. XARGS=`which xargs | $SED q`
  63.  
  64. # Are we using a source or a binary distribution?
  65.  
  66. testdir=/usr/local/mysql/mysql-test
  67. if [ -d bin/mysqld ] && [ -d mysql-test ] ; then
  68.  cd mysql-test
  69. else
  70.  if [ -d $testdir/mysql-test ] ; then
  71.    cd $testdir
  72.  fi
  73. fi
  74.  
  75. if [ ! -f ./mysql-test-run ] ; then
  76.   $ECHO "Can't find the location for the mysql-test-run script"
  77.  
  78.   $ECHO "Go to to the mysql-test directory and execute the script as follows:"
  79.   $ECHO "./mysql-test-run."
  80.   exit 1
  81. fi
  82.  
  83. #++
  84. # Misc. Definitions
  85. #--
  86.  
  87. if [ -d ../sql ] ; then
  88.    SOURCE_DIST=1
  89. else
  90.    BINARY_DIST=1
  91. fi
  92.  
  93. #BASEDIR is always one above mysql-test directory 
  94. CWD=`pwd`
  95. cd ..
  96. BASEDIR=`pwd`
  97. cd $CWD
  98. MYSQL_TEST_DIR=$BASEDIR/mysql-test
  99. export MYSQL_TEST_DIR
  100. STD_DATA=$MYSQL_TEST_DIR/std_data
  101. hostname=`hostname`        # Installed in the mysql privilege table
  102.   
  103. TESTDIR="$MYSQL_TEST_DIR/t"
  104. TESTSUFFIX=test
  105. TOT_SKIP=0
  106. TOT_PASS=0
  107. TOT_FAIL=0
  108. TOT_TEST=0
  109. USERT=0
  110. SYST=0
  111. REALT=0
  112. MYSQL_TMP_DIR=$MYSQL_TEST_DIR/var/tmp
  113. SLAVE_LOAD_TMPDIR=../../var/tmp #needs to be same length to test logging
  114. RES_SPACE="      "
  115. MYSQLD_SRC_DIRS="strings mysys include extra regex isam merge myisam \
  116.  myisammrg heap sql"
  117. #
  118. # Set LD_LIBRARY_PATH if we are using shared libraries
  119. #
  120. LD_LIBRARY_PATH="$BASEDIR/lib:$LD_LIBRARY_PATH"
  121. export LD_LIBRARY_PATH
  122.  
  123. MASTER_RUNNING=0
  124. MASTER_MYPORT=9306
  125. SLAVE_RUNNING=0
  126. SLAVE_MYPORT=9307
  127. NO_SLAVE=0
  128. USER_TEST=
  129.  
  130. EXTRA_MASTER_OPT=""
  131. EXTRA_MYSQL_TEST_OPT=""
  132. USE_RUNNING_SERVER=1
  133. DO_GCOV=""
  134. DO_GDB=""
  135. DO_DDD=""
  136. DO_CLIENT_GDB=""
  137. SLEEP_TIME=2
  138. DBUSER=""
  139.  
  140. while test $# -gt 0; do
  141.   case "$1" in
  142.     --user=*) DBUSER=`$ECHO "$1" | $SED -e "s;--user=;;"` ;;
  143.     --force)  FORCE=1 ;;
  144.     --local)   USE_RUNNING_SERVER="" ;;
  145.     --tmpdir=*) MYSQL_TMP_DIR=`$ECHO "$1" | $SED -e "s;--tmpdir=;;"` ;;
  146.     --master_port=*) MASTER_MYPORT=`$ECHO "$1" | $SED -e "s;--master_port=;;"` ;;
  147.     --slave_port=*) SLAVE_MYPORT=`$ECHO "$1" | $SED -e "s;--slave_port=;;"` ;;
  148.     --with-openssl)
  149.      EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT \
  150.      --ssl-ca=$BASEDIR/SSL/cacert.pem \
  151.      --ssl-cert=$BASEDIR/SSL/server-cert.pem \
  152.      --ssl-key=$BASEDIR/SSL/server-key.pem"
  153.      EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT \
  154.      --ssl-ca=$BASEDIR/SSL/cacert.pem \
  155.      --ssl-cert=$BASEDIR/SSL/server-cert.pem \
  156.      --ssl-key=$BASEDIR/SSL/server-key.pem" ;;
  157.     --skip-innobase)
  158.      EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-innobase"
  159.      EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-innobase" ;;
  160.     --skip-bdb)
  161.      EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-bdb"
  162.      EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-bdb" ;;
  163.     --skip-rpl) NO_SLAVE=1 ;;
  164.     --skip-test=*) SKIP_TEST=`$ECHO "$1" | $SED -e "s;--skip-test=;;"`;;
  165.     --do-test=*) DO_TEST=`$ECHO "$1" | $SED -e "s;--do-test=;;"`;;
  166.     --record)
  167.       RECORD=1;
  168.       EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1" ;;
  169.     --bench)
  170.       DO_BENCH=1
  171.       NO_SLAVE=1
  172.       ;;  
  173.     --big*)            # Actually --big-test
  174.       EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1" ;;
  175.     --sleep=*)
  176.       EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1"
  177.       SLEEP_TIME=`$ECHO "$1" | $SED -e "s;--sleep=;;"`
  178.       ;;
  179.     --user-test=*)
  180.       USER_TEST=`$ECHO "$1" | $SED -e "s;--user-test=;;"`
  181.       ;;
  182.     --mysqld=*)
  183.        TMP=`$ECHO "$1" | $SED -e "s;--mysqld=;;"`
  184.        EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT $TMP"
  185.        EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT $TMP"
  186.        ;;
  187.     --gcov )
  188.       if [ x$BINARY_DIST = x1 ] ; then
  189.     $ECHO "Cannot do coverage test without the source - please use source dist"
  190.     exit 1
  191.       fi
  192.       DO_GCOV=1
  193.       ;;
  194.     --gprof )
  195.       DO_GPROF=1
  196.       ;;  
  197.     --gdb )
  198.       if [ x$BINARY_DIST = x1 ] ; then
  199.     $ECHO "Note: you will get more meaningful output on a source distribution compiled with debugging option when running tests with --gdb option"
  200.       fi
  201.       DO_GDB=1
  202.       USE_RUNNING_SERVER=""
  203.       ;;
  204.     --client-gdb )
  205.       if [ x$BINARY_DIST = x1 ] ; then
  206.     $ECHO "Note: you will get more meaningful output on a source distribution compiled with debugging option when running tests with --client-gdb option"
  207.       fi
  208.       DO_CLIENT_GDB=1
  209.       ;;
  210.     --ddd )
  211.       if [ x$BINARY_DIST = x1 ] ; then
  212.     $ECHO "Note: you will get more meaningful output on a source distribution compiled with debugging option when running tests with --ddd option"
  213.       fi
  214.       DO_DDD=1
  215.       USE_RUNNING_SERVER=""
  216.       ;;
  217.     --skip-*)
  218.       EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT $1"
  219.       EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT $1"
  220.       ;;
  221.     --debug)
  222.       EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT \
  223.        --debug=d:t:i:O,$MYSQL_TEST_DIR/var/log/master.trace"
  224.       EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT \
  225.        --debug=d:t:i:O,$MYSQL_TEST_DIR/var/log/slave.trace"
  226.       EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT --debug"
  227.       ;;
  228.     -- )  shift; break ;;
  229.     --* ) $ECHO "Unrecognized option: $1"; exit 1 ;;
  230.     * ) break ;;
  231.   esac
  232.   shift
  233. done
  234.  
  235. #++
  236. # mysqld Environment Parameters
  237. #--
  238.  
  239. MYRUN_DIR=$MYSQL_TEST_DIR/var/run
  240. MASTER_MYDDIR="$MYSQL_TEST_DIR/var/master-data"
  241. MASTER_MYSOCK="$MYSQL_TMP_DIR/mysql-master.sock"
  242. MASTER_MYPID="$MYRUN_DIR/mysqld.pid"
  243. MASTER_MYLOG="$MYSQL_TEST_DIR/var/log/mysqld.log"
  244. MASTER_MYERR="$MYSQL_TEST_DIR/var/log/mysqld.err"
  245.  
  246. SLAVE_MYDDIR="$MYSQL_TEST_DIR/var/slave-data"
  247. SLAVE_MYSOCK="$MYSQL_TMP_DIR/mysql-slave.sock"
  248. SLAVE_MYPID="$MYRUN_DIR/mysqld-slave.pid"
  249. SLAVE_MYLOG="$MYSQL_TEST_DIR/var/log/mysqld-slave.log"
  250. SLAVE_MYERR="$MYSQL_TEST_DIR/var/log/mysqld-slave.err"
  251.  
  252. CLIENT_MYLOG="$MYSQL_TEST_DIR/var/log/client.log"
  253. SMALL_SERVER="-O key_buffer_size=1M -O sort_buffer=256K -O max_heap_table_size=1M"
  254.  
  255. export MASTER_MYPORT
  256. export SLAVE_MYPORT
  257.  
  258. if [ x$SOURCE_DIST = x1 ] ; then
  259.  MY_BASEDIR=$MYSQL_TEST_DIR
  260. else
  261.  MY_BASEDIR=$BASEDIR
  262. fi  
  263.  
  264. # Create the directories
  265.  
  266. # This should be fixed to be not be dependent on the contence of MYSQL_TMP_DIR
  267. # or MYRUN_DIR
  268. # (mkdir -p is not portable)
  269. [ -d $MYSQL_TEST_DIR/var ] || mkdir $MYSQL_TEST_DIR/var
  270. [ -d $MYSQL_TEST_DIR/var/tmp ] || mkdir $MYSQL_TEST_DIR/var/tmp
  271. [ -d $MYSQL_TEST_DIR/var/run ] || mkdir $MYSQL_TEST_DIR/var/run
  272.  
  273. [ -z "$COLUMNS" ] && COLUMNS=80
  274. E=`$EXPR $COLUMNS - 8`
  275. DASH72=`$ECHO '------------------------------------------------------------------------'|$CUT -c 1-$E`
  276.  
  277. # on source dist, we pick up freshly build executables
  278. # on binary, use what is installed
  279. if [ x$SOURCE_DIST = x1 ] ; then
  280.  MYSQLD="$BASEDIR/sql/mysqld"
  281.  if [ -f "$BASEDIR/client/.libs/lt-mysqltest" ] ; then
  282.    MYSQL_TEST="$BASEDIR/client/.libs/lt-mysqltest"
  283.  else
  284.    MYSQL_TEST="$BASEDIR/client/mysqltest"
  285.  fi
  286.  MYSQLADMIN="$BASEDIR/client/mysqladmin"
  287.  MYSQL="$BASEDIR/client/mysql"
  288.  LANGUAGE="$BASEDIR/sql/share/english/"
  289.  CHARSETSDIR="$BASEDIR/sql/share/charsets"
  290.  INSTALL_DB="./install_test_db"
  291. else
  292.  MYSQLD="$BASEDIR/bin/mysqld"
  293.  MYSQL_TEST="$BASEDIR/bin/mysqltest"
  294.  MYSQLADMIN="$BASEDIR/bin/mysqladmin"
  295.  MYSQL="$BASEDIR/bin/mysql"
  296.  INSTALL_DB="./install_test_db -bin"
  297.  if test -d "$BASEDIR/share/mysql/english" 
  298.  then
  299.    LANGUAGE="$BASEDIR/share/mysql/english/"
  300.    CHARSETSDIR="$BASEDIR/share/mysql/charsets"
  301.  else
  302.    LANGUAGE="$BASEDIR/share/english/"
  303.    CHARSETSDIR="$BASEDIR/share/charsets"
  304.   fi
  305. fi
  306.  
  307. # If we should run all tests cases, we will use a local server for that
  308.  
  309. if [ -z "$1" ]
  310. then
  311.    USE_RUNNING_SERVER=""
  312. fi
  313. if [ -n "$USE_RUNNING_SERVER" ]
  314. then
  315.    MASTER_MYSOCK="/tmp/mysql.sock"
  316.    DBUSER=${DBUSER:-test}
  317. else
  318.    DBUSER=${DBUSER:-root}        # We want to do FLUSH xxx commands
  319. fi
  320.  
  321. if [ -w / ]
  322. then
  323.     # We are running as root;  We need to add the --root argument
  324.     EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --user=root"
  325.     EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --user=root"
  326. fi
  327.  
  328.  
  329. MYSQL_TEST_ARGS="--no-defaults --socket=$MASTER_MYSOCK --database=$DB --user=$DBUSER --password=$DBPASSWD --silent -v --tmpdir=$MYSQL_TMP_DIR"
  330. MYSQL_TEST_BIN=$MYSQL_TEST
  331. MYSQL_TEST="$MYSQL_TEST $MYSQL_TEST_ARGS"
  332. GDB_CLIENT_INIT=$MYSQL_TMP_DIR/gdbinit.client
  333. GDB_MASTER_INIT=$MYSQL_TMP_DIR/gdbinit.master
  334. GDB_SLAVE_INIT=$MYSQL_TMP_DIR/gdbinit.slave
  335. GCOV_MSG=$MYSQL_TMP_DIR/mysqld-gcov.out
  336. GCOV_ERR=$MYSQL_TMP_DIR/mysqld-gcov.err
  337. GPROF_DIR=$MYSQL_TMP_DIR/gprof
  338. GPROF_MASTER=$GPROF_DIR/master.gprof
  339. GPROF_SLAVE=$GPROF_DIR/slave.gprof
  340. TIMEFILE="$MYSQL_TMP_DIR/mysqltest-time"
  341. SLAVE_MYSQLD=$MYSQLD #this can be changed later if we are doing gcov
  342.  
  343. #++
  344. # Function Definitions
  345. #--
  346. wait_for_server_start ()
  347. {
  348.    $MYSQLADMIN --no-defaults -u $DBUSER --silent -O connect_timeout=10 -w3 --host=$hostname --port=$1  ping >> $CLIENT_MYLOG 2>&1
  349.    exit_code=$?
  350.    if [ $exit_code != 0 ]; then
  351.     echo "Error: Could not start $2, exit code $exit_code";
  352.    fi
  353. }
  354.  
  355. prompt_user ()
  356. {
  357.  $ECHO $1
  358.  read unused
  359. }
  360.  
  361. # We can't use diff -u or diff -a as these are not portable
  362.  
  363. show_failed_diff ()
  364. {
  365.   reject_file=r/$1.reject
  366.   result_file=r/$1.result
  367.   eval_file=r/$1.eval
  368.   
  369.   if [ -f $eval_file ]
  370.   then
  371.     result_file=$eval_file
  372.   fi
  373.     
  374.   if [ -x "$DIFF" ] && [ -f $reject_file ]
  375.   then
  376.     echo "Below are the diffs between actual and expected results:"
  377.     echo "-------------------------------------------------------"
  378.     $DIFF -c $result_file $reject_file
  379.     echo "-------------------------------------------------------"
  380.     echo "Please follow the instructions outlined at"
  381.     echo "http://www.mysql.com/doc/R/e/Reporting_mysqltest_bugs.html"
  382.     echo "to find the reason to this problem and how to report this."
  383.   fi  
  384. }
  385.  
  386. do_gdb_test ()
  387. {
  388.   mysql_test_args="$MYSQL_TEST_ARGS $1"
  389.   $ECHO "set args $mysql_test_args < $2" > $GDB_CLIENT_INIT
  390.   echo "Set breakpoints ( if needed) and type 'run' in gdb window"
  391.   #this xterm should not be backgrounded
  392.   xterm -title "Client" -e gdb -x $GDB_CLIENT_INIT $MYSQL_TEST_BIN
  393. }
  394.  
  395. error () {
  396.     $ECHO  "Error:  $1"
  397.     exit 1
  398. }
  399.  
  400. error_is () {
  401.     $TR "\n" " " < $TIMEFILE | $SED -e 's/.* At line \(.*\)\: \(.*\)Command .*$/   \>\> Error at line \1: \2<\</'
  402. }
  403.  
  404. prefix_to_8() {
  405.  $ECHO "        $1" | $SED -e 's:.*\(........\)$:\1:'
  406. }
  407.  
  408. pass_inc () {
  409.     TOT_PASS=`$EXPR $TOT_PASS + 1`
  410. }
  411.  
  412. fail_inc () {
  413.     TOT_FAIL=`$EXPR $TOT_FAIL + 1`
  414. }
  415.  
  416. skip_inc () {
  417.     TOT_SKIP=`$EXPR $TOT_SKIP + 1`
  418. }
  419.  
  420. total_inc () {
  421.     TOT_TEST=`$EXPR $TOT_TEST + 1`
  422. }
  423.  
  424. report_stats () {
  425.     if [ $TOT_FAIL = 0 ]; then
  426.     $ECHO "All $TOT_TEST tests were successful."
  427.     else
  428.     xten=`$EXPR $TOT_PASS \* 10000`   
  429.     raw=`$EXPR $xten / $TOT_TEST`     
  430.     raw=`$PRINTF %.4d $raw`           
  431.     whole=`$PRINTF %.2s $raw`         
  432.     xwhole=`$EXPR $whole \* 100`      
  433.     deci=`$EXPR $raw - $xwhole`       
  434.     $ECHO  "Failed ${TOT_FAIL}/${TOT_TEST} tests, ${whole}.${deci}% successful."
  435.     $ECHO ""
  436.         $ECHO "The log files in $MYSQL_TEST_DIR/var/log may give you some hint"
  437.     $ECHO "of what when wrong."
  438.     $ECHO "If you want to report this error, please read first the documentation at"
  439.         $ECHO "http://www.mysql.com/doc/M/y/MySQL_test_suite.html"
  440.     fi
  441. }
  442.  
  443. mysql_install_db () {
  444.     $ECHO "Removing Stale Files"
  445.     $RM -rf $MASTER_MYDDIR $SLAVE_MYDDIR $SLAVE_MYLOG $MASTER_MYLOG \
  446.      $SLAVE_MYERR $MASTER_MYERR
  447.     $ECHO "Installing Master Databases"
  448.     $INSTALL_DB
  449.     if [ $? != 0 ]; then
  450.     error "Could not install master test DBs"
  451.     exit 1
  452.     fi
  453.     $ECHO "Installing Slave Databases"
  454.     $INSTALL_DB -slave
  455.     if [ $? != 0 ]; then
  456.     error "Could not install slave test DBs"
  457.     exit 1
  458.     fi
  459.     # Give mysqld some time to die.
  460.     sleep $SLEEP_TIME
  461.     return 0
  462. }
  463.  
  464. gprof_prepare ()
  465. {
  466.  rm -rf $GPROF_DIR
  467.  mkdir -p $GPROF_DIR 
  468. }
  469.  
  470. gprof_collect ()
  471. {
  472.  if [ -f $MASTER_MYDDIR/gmon.out ]; then
  473.    gprof $MYSQLD $MASTER_MYDDIR/gmon.out > $GPROF_MASTER
  474.    echo "Master execution profile has been saved in $GPROF_MASTER"
  475.  fi
  476.  if [ -f $SLAVE_MYDDIR/gmon.out ]; then
  477.    gprof $MYSQLD $SLAVE_MYDDIR/gmon.out > $GPROF_SLAVE
  478.    echo "Slave execution profile has been saved in $GPROF_SLAVE"
  479.  fi
  480. }
  481.  
  482. gcov_prepare () {
  483.     $FIND $BASEDIR -name \*.gcov \
  484.     -or -name \*.da | $XARGS $RM
  485. }
  486.  
  487. gcov_collect () {
  488.     $ECHO "Collecting source coverage info..."
  489.     [ -f $GCOV_MSG ] && $RM $GCOV_MSG
  490.     [ -f $GCOV_ERR ] && $RM $GCOV_ERR
  491.     for d in $MYSQLD_SRC_DIRS; do
  492.     cd $BASEDIR/$d
  493.     for f in *.h *.cc *.c; do
  494.         $GCOV $f 2>>$GCOV_ERR  >>$GCOV_MSG
  495.     done
  496.     cd $MYSQL_TEST_DIR
  497.     done
  498.  
  499.     $ECHO "gcov info in $GCOV_MSG, errors in $GCOV_ERR"
  500. }
  501.  
  502.  
  503. start_master()
  504. {
  505.     [ x$MASTER_RUNNING = 1 ] && return
  506.     #run master initialization shell script if one exists
  507.     if [ -f "$master_init_script" ] ;
  508.     then
  509.         /bin/sh $master_init_script
  510.     fi
  511.     cd $BASEDIR # for gcov
  512.     # Remove old berkeley db log files that can confuse the server
  513.     $RM -f $MASTER_MYDDIR/log.*    
  514.     #start master
  515.     if [ -z "$DO_BENCH" ]
  516.     then
  517.       master_args="--no-defaults --log-bin=master-bin \
  518.             --server-id=1 \
  519.             --basedir=$MY_BASEDIR \
  520.         --port=$MASTER_MYPORT \
  521.         --exit-info=256 \
  522.         --core \
  523.             --datadir=$MASTER_MYDDIR \
  524.         --pid-file=$MASTER_MYPID \
  525.         --socket=$MASTER_MYSOCK \
  526.             --log=$MASTER_MYLOG \
  527.         --character-sets-dir=$CHARSETSDIR \
  528.         --tmpdir=$MYSQL_TMP_DIR \
  529.         --language=$LANGUAGE \
  530.             --innodb_data_file_path=ibdata1:50M \
  531.          $SMALL_SERVER \
  532.          $EXTRA_MASTER_OPT $EXTRA_MASTER_MYSQLD_OPT"
  533.     else
  534.       master_args="--no-defaults --log-bin=master-bin --server-id=1 \
  535.             --basedir=$MY_BASEDIR \
  536.         --port=$MASTER_MYPORT \
  537.             --datadir=$MASTER_MYDDIR \
  538.         --pid-file=$MASTER_MYPID \
  539.         --socket=$MASTER_MYSOCK \
  540.             --default-character-set=$CHARACTER_SET \
  541.         --core \
  542.         --tmpdir=$MYSQL_TMP_DIR \
  543.         --language=$LANGUAGE \
  544.             --innodb_data_file_path=ibdata1:50M \
  545.          $SMALL_SERVER \
  546.          $EXTRA_MASTER_OPT $EXTRA_MASTER_MYSQLD_OPT"
  547.     fi         
  548.     if [ x$DO_DDD = x1 ]
  549.     then
  550.       $ECHO "set args $master_args" > $GDB_MASTER_INIT
  551.       ddd --debugger "gdb -x $GDB_MASTER_INIT" $MYSQLD &
  552.       prompt_user "Hit enter to continue after you've started the master"
  553.     elif [ x$DO_GDB = x1 ]
  554.     then
  555.       $ECHO "set args $master_args" > $GDB_MASTER_INIT
  556.       xterm -title "Master" -e gdb -x $GDB_MASTER_INIT $MYSQLD &
  557.       prompt_user "Hit enter to continue after you've started the master"
  558.     else        
  559.       $MYSQLD $master_args  >> $MASTER_MYERR 2>&1 &
  560.     fi  
  561.   wait_for_server_start $MASTER_MYPORT master
  562.   MASTER_RUNNING=1
  563. }
  564.  
  565. start_slave()
  566. {
  567.     [ x$SKIP_SLAVE = x1 ] && return
  568.     [ x$SLAVE_RUNNING = 1 ] && return
  569.     
  570.     #run slave initialization shell script if one exists
  571.     if [ -f "$slave_init_script" ] ;
  572.     then
  573.       /bin/sh $slave_init_script
  574.     fi
  575.     
  576.     if [ -z "$SLAVE_MASTER_INFO" ] ; then
  577.       master_info="--master-user=root \
  578.         --master-connect-retry=1 \
  579.         --master-host=127.0.0.1 \
  580.         --master-password= \
  581.         --master-port=$MASTER_MYPORT \
  582.         --server-id=2"
  583.    else
  584.      master_info=$SLAVE_MASTER_INFO
  585.    fi        
  586.     
  587.     $RM -f $SLAVE_MYDDIR/log.*    
  588.     slave_args="--no-defaults $master_info \
  589.             --exit-info=256 \
  590.         --log-bin=slave-bin --log-slave-updates \
  591.             --log=$SLAVE_MYLOG \
  592.             --basedir=$MY_BASEDIR \
  593.             --datadir=$SLAVE_MYDDIR \
  594.         --pid-file=$SLAVE_MYPID \
  595.         --port=$SLAVE_MYPORT \
  596.         --socket=$SLAVE_MYSOCK \
  597.         --character-sets-dir=$CHARSETSDIR \
  598.         --core \
  599.         --tmpdir=$MYSQL_TMP_DIR \
  600.             --language=$LANGUAGE \
  601.         --skip-innodb --skip-slave-start \
  602.         --master-retry-count=5 \
  603.          $SMALL_SERVER \
  604.              $EXTRA_SLAVE_OPT $EXTRA_SLAVE_MYSQLD_OPT"
  605.     if [ x$DO_DDD = x1 ]
  606.     then
  607.       $ECHO "set args $master_args" > $GDB_SLAVE_INIT
  608.       ddd --debugger "gdb -x $GDB_SLAVE_INIT" $SLAVE_MYSQLD &
  609.       prompt_user "Hit enter to continue after you've started the slave"
  610.     elif [ x$DO_GDB = x1 ]
  611.     then
  612.       $ECHO "set args $slave_args" > $GDB_SLAVE_INIT
  613.       xterm -title "Slave" -e gdb -x $GDB_SLAVE_INIT $SLAVE_MYSQLD &
  614.       prompt_user "Hit enter to continue after you've started the slave"
  615.     else
  616.       $SLAVE_MYSQLD $slave_args  >> $SLAVE_MYERR 2>&1 &
  617.     fi
  618.     wait_for_server_start $SLAVE_MYPORT slave
  619.     SLAVE_RUNNING=1
  620. }
  621.  
  622. mysql_start () {
  623.     $ECHO "Starting MySQL daemon"
  624.     start_master
  625.     start_slave
  626.     cd $MYSQL_TEST_DIR
  627.     return 1
  628. }
  629.  
  630. stop_slave ()
  631. {
  632.   if [ x$SLAVE_RUNNING = x1 ]
  633.   then
  634.     $MYSQLADMIN --no-defaults --socket=$SLAVE_MYSOCK -u root -O shutdown_timeout=20 shutdown
  635.     if [ $? != 0 ] && [ -f $SLAVE_MYPID ]
  636.     then # try harder!
  637.      $ECHO "slave not cooperating with mysqladmin, will try manual kill"
  638.      kill `$CAT $SLAVE_MYPID`
  639.      sleep $SLEEP_TIME
  640.      if [ -f $SLAVE_MYPID ] ; then
  641.        $ECHO "slave refused to die. Sending SIGKILL"
  642.        kill -9 `$CAT $SLAVE_MYPID`
  643.        $RM -f $SLAVE_MYPID
  644.      else
  645.       $ECHO "slave responded to SIGTERM " 
  646.      fi
  647.     fi
  648.     SLAVE_RUNNING=0
  649.   fi  
  650. }
  651.  
  652. stop_master ()
  653. {
  654.   if [ x$MASTER_RUNNING = x1 ]
  655.   then
  656.     $MYSQLADMIN --no-defaults --socket=$MASTER_MYSOCK -u root -O shutdown_timeout=20 shutdown
  657.     if [ $? != 0 ] && [ -f $MASTER_MYPID ]
  658.     then # try harder!
  659.      $ECHO "master not cooperating with mysqladmin, will try manual kill"
  660.      kill `$CAT $MASTER_MYPID`
  661.      sleep $SLEEP_TIME
  662.      if [ -f $MASTER_MYPID ] ; then
  663.        $ECHO "master refused to die. Sending SIGKILL"
  664.        kill -9 `$CAT $MASTER_MYPID`
  665.        $RM -f $MASTER_MYPID
  666.      else
  667.       $ECHO "master responded to SIGTERM " 
  668.      fi
  669.     fi
  670.     MASTER_RUNNING=0
  671.   fi
  672. }
  673.  
  674. mysql_stop ()
  675. {
  676.  $ECHO  "Ending Tests"
  677.  $ECHO  "Shutting-down MySQL daemon"
  678.  $ECHO  ""
  679.  stop_master
  680.  $ECHO "Master shutdown finished"
  681.  stop_slave
  682.  $ECHO "Slave shutdown finished"
  683.  
  684.  return 1
  685. }
  686.  
  687. mysql_restart () {
  688.  
  689.     mysql_stop
  690.     mysql_start
  691.  
  692.     return 1
  693. }
  694.  
  695. mysql_loadstd () {
  696.     
  697.     # cp $STD_DATA/*.frm $STD_DATA/*.MRG $MASTER_MYDDIR/test  
  698.     return 1
  699. }
  700.  
  701. run_testcase ()
  702. {
  703.  tf=$1
  704.  tname=`$BASENAME $tf .test`
  705.  master_opt_file=$TESTDIR/$tname-master.opt
  706.  slave_opt_file=$TESTDIR/$tname-slave.opt
  707.  master_init_script=$TESTDIR/$tname-master.sh
  708.  slave_init_script=$TESTDIR/$tname-slave.sh
  709.  slave_master_info_file=$TESTDIR/$tname-slave-master-info.opt
  710.  SKIP_SLAVE=`$EXPR \( $tname : rpl \) = 0`
  711.  if [ -n "$SKIP_TEST" ] ; then 
  712.    SKIP_THIS_TEST=`$EXPR \( $tname : "$SKIP_TEST" \) != 0`
  713.    if [ x$SKIP_THIS_TEST = x1 ] ;
  714.    then
  715.     return;
  716.    fi
  717.   fi
  718.  
  719.  if [ -n "$DO_TEST" ] ; then 
  720.    DO_THIS_TEST=`$EXPR \( $tname : "$DO_TEST" \) != 0`
  721.    if [ x$DO_THIS_TEST = x0 ] ;
  722.    then
  723.     return;
  724.    fi
  725.   fi
  726.  
  727.  
  728.  if [ x${NO_SLAVE}x$SKIP_SLAVE = x1x0 ] ;
  729.  then
  730.    USERT="    ...."
  731.    SYST="    ...."
  732.    REALT="    ...."
  733.    timestr="$USERT $SYST $REALT"
  734.    pname=`$ECHO "$tname                        "|$CUT -c 1-24`
  735.    RES="$pname  $timestr"
  736.    skip_inc
  737.    $ECHO "$RES$RES_SPACE [ skipped ]"
  738.    return
  739.  fi
  740.  
  741.  if [ -z "$USE_RUNNING_SERVER" ] ;
  742.  then
  743.    if [ -f $master_opt_file ] ;
  744.    then
  745.      EXTRA_MASTER_OPT=`$CAT $master_opt_file`
  746.      stop_master
  747.      start_master
  748.    else
  749.      if [ ! -z "$EXTRA_MASTER_OPT" ] || [ x$MASTER_RUNNING != x1 ] ;
  750.      then
  751.        EXTRA_MASTER_OPT=""
  752.        stop_master
  753.        start_master
  754.      fi  
  755.    fi
  756.    do_slave_restart=0
  757.  
  758.    if [ -f $slave_opt_file ] ;
  759.    then
  760.      EXTRA_SLAVE_OPT=`$CAT $slave_opt_file`
  761.      do_slave_restart=1
  762.    else
  763.     if [ ! -z "$EXTRA_SLAVE_OPT" ] || [ x$SLAVE_RUNNING != x1 ] ;
  764.     then
  765.       EXTRA_SLAVE_OPT=""
  766.       do_slave_restart=1    
  767.     fi  
  768.    fi
  769.  
  770.    if [ -f $slave_master_info_file ] ; then
  771.      SLAVE_MASTER_INFO=`$CAT $slave_master_info_file`
  772.      do_slave_restart=1
  773.    else
  774.      if [ ! -z "$SLAVE_MASTER_INFO" ] || [ x$SLAVE_RUNNING != x1 ] ;
  775.      then
  776.        SLAVE_MASTER_INFO=""
  777.        do_slave_restart=1    
  778.      fi  
  779.    fi
  780.  
  781.    if [ x$do_slave_restart = x1 ] ; then
  782.      stop_slave
  783.      start_slave
  784.    fi
  785.  fi
  786.  cd $MYSQL_TEST_DIR
  787.   
  788.  if [ -f $tf ] ; then
  789.     $RM -f r/$tname.*reject
  790.     mysql_test_args="-R r/$tname.result $EXTRA_MYSQL_TEST_OPT"
  791.      if [ -z "$DO_CLIENT_GDB" ] ; then
  792.      mytime=`$TIME -p $MYSQL_TEST  $mysql_test_args < $tf 2> $TIMEFILE`
  793.     else
  794.      do_gdb_test "$mysql_test_args" "$tf"
  795.     fi
  796.      
  797.     res=$?
  798.  
  799.     if [ $res = 0 ]; then
  800.     mytime=`$CAT $TIMEFILE | $TAIL -3 | $TR '\n' ':'`
  801.  
  802.     USERT=`$ECHO $mytime | $CUT -d : -f 2 | $CUT -d ' ' -f 2`
  803.         USERT=`prefix_to_8 $USERT`
  804.     SYST=`$ECHO $mytime | $CUT -d : -f 3 | $CUT -d ' ' -f 2`
  805.         SYST=`prefix_to_8 $SYST`
  806.     REALT=`$ECHO $mytime | $CUT -d : -f 1 | $CUT -d ' ' -f 2`
  807.         REALT=`prefix_to_8 $REALT`
  808.     else
  809.     USERT="    ...."
  810.     SYST="    ...."
  811.     REALT="    ...."
  812.     fi
  813.  
  814.     timestr="$USERT $SYST $REALT"
  815.     pname=`$ECHO "$tname                        "|$CUT -c 1-24`
  816.     RES="$pname  $timestr"
  817.  
  818.     if [ $res = 0 ]; then
  819.       total_inc
  820.       pass_inc
  821.       $ECHO "$RES$RES_SPACE [ pass ]"
  822.     else
  823.       # why the following ``if'' ? That is why res==1 is special ?
  824.       if [ $res = 2 ]; then
  825.         skip_inc
  826.     $ECHO "$RES$RES_SPACE [ skipped ]"
  827.       else
  828.     total_inc
  829.         fail_inc
  830.     $ECHO "$RES$RES_SPACE [ fail ]"
  831.         $ECHO
  832.     error_is
  833.     show_failed_diff $tname
  834.     $ECHO
  835.     if [ x$FORCE != x1 ] ; then
  836.      $ECHO "Aborting. To continue, re-run with '--force'."
  837.      $ECHO
  838.          if [ -z "$DO_GDB" ] && [ -z "$USE_RUNNING_SERVER" ] && [ -z "$DO_DDD" ]
  839.      then
  840.        mysql_stop
  841.         fi
  842.      exit 1
  843.     fi
  844.      
  845.         if [ -z "$DO_GDB" ] && [ -z "$USE_RUNNING_SERVER" ] && [ -z "$DO_DDD" ]
  846.     then
  847.       mysql_restart
  848.     fi
  849.     $ECHO "Resuming Tests"
  850.     $ECHO ""
  851.       fi
  852.     fi
  853.   fi
  854. }
  855.  
  856.  
  857. ######################################################################
  858. # Main script starts here
  859. ######################################################################
  860.  
  861. [ "$DO_GCOV" -a ! -x "$GCOV" ] && error "No gcov found"
  862.  
  863. [ "$DO_GCOV" ] && gcov_prepare 
  864. [ "$DO_GPROF" ] && gprof_prepare 
  865.  
  866. # Ensure that no old mysqld test servers are running
  867. if [ -z "$USE_RUNNING_SERVER" ]
  868. then
  869.   $MYSQLADMIN --no-defaults --socket=$MASTER_MYSOCK -u root -O connect_timeout=5 shutdown > /dev/null 2>&1
  870.   $MYSQLADMIN --no-defaults --socket=$SLAVE_MYSOCK -u root -O connect_timeout=5 shutdown > /dev/null 2>&1
  871.   $ECHO "Installing Test Databases"
  872.   mysql_install_db
  873.  
  874. #do not automagically start deamons if we are in gdb or running only one test
  875. #case
  876.   if [ -z "$DO_GDB" ] && [ -z "$DO_DDD" ]
  877.   then
  878.     mysql_start
  879.   fi
  880.   $ECHO  "Loading Standard Test Databases"
  881.   mysql_loadstd
  882. fi
  883.  
  884.  
  885. $ECHO  "Starting Tests"
  886.  
  887. if [ "$DO_BENCH" = 1 ]
  888. then
  889.  BENCHDIR=$BASEDIR/sql-bench/
  890.  savedir=`pwd`
  891.  cd $BENCHDIR
  892.  if [ -z "$1" ]
  893.  then
  894.   ./run-all-tests --socket=$MASTER_MYSOCK --user=root
  895.  else
  896.  if [ -x "./$1" ]
  897.   then
  898.    ./$1 --socket=$MASTER_MYSOCK --user=root
  899.   else
  900.    echo "benchmark $1 not found" 
  901.   fi
  902.  fi  
  903.  cd $savedir
  904.  mysql_stop
  905.  exit
  906. fi
  907.  
  908.  
  909. $ECHO
  910. $ECHO " TEST                         USER   SYSTEM  ELAPSED        RESULT"
  911. $ECHO $DASH72
  912.  
  913. if [ -z "$1" ] ;
  914. then
  915.  if [ x$RECORD = x1 ]; then
  916.   $ECHO "Will not run in record mode without a specific test case."
  917.  else
  918.   if [ -z "$USER_TEST" ]
  919.   then
  920.     for tf in $TESTDIR/*.$TESTSUFFIX
  921.     do
  922.      run_testcase $tf
  923.     done
  924.     $RM -f $TIMEFILE    # Remove for full test
  925.   else
  926.    $USER_TEST  
  927.   fi  
  928.  fi
  929. else 
  930. tname=`$BASENAME $1 .test`
  931.  tf=$TESTDIR/$tname.$TESTSUFFIX
  932.  if [ -f $tf ] ; then
  933.   run_testcase $tf
  934.  else
  935.    $ECHO "Test case $tf does not exist."
  936.  fi
  937. fi
  938.  
  939. $ECHO $DASH72
  940. $ECHO
  941.  
  942. if [ -z "$DO_GDB" ] && [ -z "$USE_RUNNING_SERVER" ] && [ -z "$DO_DDD" ]
  943. then
  944.     mysql_stop
  945. fi
  946.  
  947. report_stats
  948. $ECHO
  949.  
  950. [ "$DO_GCOV" ] && gcov_collect # collect coverage information
  951. [ "$DO_GPROF" ] && gprof_collect # collect coverage information
  952.  
  953. exit 0
  954.